package com.cskaoyan.javase.oop2._1extends._10override._1basic;

/**
 * 方法覆盖,父子类中存在同名的成员方法,是有严格的语法限制的,不是随便写的
 * 注解"@Override"写在子类重写父类方法的方法头上,用于检查该方法是否重写自父类
 *      如果是,编译不会报错
 *      反之,会编译报错
 * 要求: 以后重写方法,必须要加注解"@Override"
 *      不加是错误的
 *
 * 加注解的好处:
 *      1.提升代码可读性,有该注解的方法不是该类自定义的,而是重写自父类的
 *      2.检查语法,避免错误的认定某个方法是重写方法
 *
 * 方法重写的语法:
 * 对于以下父类中的成员方法:
 * [访问权限修饰符] 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 那么在子类中重写它时,必须:
 *      1.访问权限修饰符可以更宽松,不能更严格
 *      当然也可以保持一致.
 *
 *      2.返回值类型是可以修改的
 *          子类方法的返回值类型需要和父类方法返回值类型保持"兼容"
 *          什么是兼容呢?考虑自动类型转换(今晚的作业)
 *
 *      3.方法名必须父子类保持一致.
 *      4.形参列表必须严格保持一致,一点都改不了
 *          注: 形参名无所谓,可以不一样,因为名字不同对方法调用不影响
 *      5.方法体是无所谓的,可以随便改.保持一致,保持空着等等.
 *
 *
 * 方法的重载(overload) vs 方法的重写(override)
 * 相同点:
 *      1.都要求两个方法的方法名一样
 *      2.方法体都无所谓,随便写
 *
 * 不同点:
 *      1.重载必然是在同一个类中,重写必然是两个类之间,在继承的父子类之间发生
 *      2.重载不关心访问权限修饰符,重写要求子类方法的访问权限不可以更严格
 *      3.重载不关心返回值类型,重写要求子类方法的返回值类型和父类保持兼容
 *      4.重载要求形参列表必须不同,重写要求必须相同
 *
 * @since 17:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {

    }
}

class Phone {
    void call(int a) {
        System.out.println("拨号然后打电话~");
    }
}

class IPhone extends Phone {
    @Override
    public void call(int b) {
        System.out.println("嘿Siri,帮我打电话给小马哥~");
    }

    // @Override
    public void call2() {
    }
}